package com.lazycat.leetcode.editor.cn;
//2023-06-19 12:05:15
//给你一个整数数组 nums，请你找出并返回能被三整除的元素最大和。 
//
// 
// 
//
//
// 示例 1： 
//
// 输入：nums = [3,6,5,1,8]
//输出：18
//解释：选出数字 3, 6, 1 和 8，它们的和是 18（可被 3 整除的最大和）。 
//
// 示例 2： 
//
// 输入：nums = [4]
//输出：0
//解释：4 不能被 3 整除，所以无法选出数字，返回 0。
// 
//
// 示例 3： 
//
// 输入：nums = [1,2,3,4,4]
//输出：12
//解释：选出数字 1, 3, 4 以及 4，它们的和是 12（可被 3 整除的最大和）。
// 
//
// 
//
// 提示： 
//
// 
// 1 <= nums.length <= 4 * 10^4 
// 1 <= nums[i] <= 10^4 
// 
//
// Related Topics 贪心 数组 动态规划 排序 👍 256 👎 0

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class GreatestSumDivisibleByThree {
    public static void main(String[] args) {
        //创建该题目的对象方便调用
        Solution solution = new GreatestSumDivisibleByThree().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int maxSumDivThree(int[] nums) {
        int ans = 0;
        for(int x : nums){
            ans += x;
        }
        if(ans % 3 == 0){
            return ans;
        }

        List<Integer> listMod1 = new ArrayList<>();
        List<Integer> listMod2 = new ArrayList<>();
        for(int num : nums){
            if(num%3 == 2){
                listMod2.add(num);
            }if(num%3 == 1){
                listMod1.add(num);
            }
        }

        Collections.sort(listMod1);
        Collections.sort(listMod2);

        int newAns = ans;

        if(newAns%3 == 2){
            List<Integer> temp = listMod1;
            listMod1 = listMod2;
            listMod2 = temp;
        }

        newAns = listMod1.isEmpty() ? 0 : ans-listMod1.get(0);
        if(listMod2.size()>1){
            newAns = Math.max(newAns,ans-listMod2.get(0)-listMod2.get(1));
        }
        return newAns;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}